#include <cstdio>
#include <algorithm>
#include <cstring>
#define _clr(x,a) memset(x,a,sizeof(x))
using namespace std;
const int N=1000010;
char s[N];
int Next[N];
int n;
void kmp_pre(char* p){
    _clr(Next,0);
    int i=0;
    int j=-1;
    Next[0]=-1;
    while(i<n){
        if(j==-1 || p[i]==p[j]){
            Next[++i]=++j;
        }
        else{
            j=Next[j];
        }
    }
}
int main(void){
    int c=1;
    while(~scanf("%d",&n) && n){
        scanf("%s",s);
        kmp_pre(s);
        // for(int i=0;i<=n;i++){
        //     printf("%d ",Next[i]);
        // }
        // printf("\n");
        printf("Test case #%d\n",c++);
        for(int i=2;i<=n;i++){
            //比如Next[9]=6 9-6得到就是剩下6-9这个字符串 而这个字符串肯定和前面3-5相同（Next数组的性质）
            //而同理3-5也肯定和0-2相同（主要就是把3-5当成属于不同的字符串看）
            if(Next[i]!=0 && i%(i-Next[i])==0){
                printf("%d %d\n",i,i/(i-Next[i]));
            }
        }
        printf("\n");
    }
    return 0;
}
